3.1.0 JS 严格模式

为脚本开启严格模式节

为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句 "use strict"; (或 'use strict';

// 整个脚本都开启严格模式的语法
"use strict";
var v = "Hi!  I'm a strict mode script!";
1
2
3

为函数开启严格模式节

同样的,要给某个函数开启严格模式,得把 "use strict"; (或'use strict'; )声明一字不漏地放在函数体所有语句之前。

function strict(){
  // 函数级别严格模式语法
  'use strict';
  function nested() { return "And so am I!"; }
  return "Hi!  I'm a strict mode function!  " + nested();
}
function notStrict() { return "I'm not strict."; }
1
2
3
4
5
6
7

js 严格模式 'use strict'

  • 设立"严格模式"的目的,主要有以下几个:
    • 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
    • 消除代码运行的一些不安全之处,保证代码运行的安全;
    • 提高编译器效率,增加运行速度;
    • 为未来新版本的Javascript做好铺垫。

严格模式中的变化

  • 严格模式下无法再意外创建全局变量: 严格模式中意外创建全局变量被抛出错误替代
  • 严格模式会使引起静默失败(silently fail,注:不报错也没有任何效果)的赋值操抛出异常
  • 在严格模式下, 试图删除不可删除的属性时会抛出异常
  • 在Gecko版本34之前,严格模式要求一个对象内的所有属性名在对象内必须唯一
  • 严格模式要求函数的参数名唯一
  • 严格模式禁止八进制数字语法
  • ECMAScript 6中的严格模式禁止设置primitive值的属性

简化变量的使用

  • 严格模式禁用 with.
  • 严格模式下的 eval 不再为上层范围(surrounding scope,注:包围eval代码块的范围)引入新变量.
  • 严格模式禁止删除声明变量
  • 严格模式让arguments和eval少了一些奇怪的行为
  • 严格模式下,参数的值不会随 arguments 对象的值的改变而变化
  • 不再支持 arguments.callee。正常模式下,arguments.callee 指向当前正在执行的函数。(这意味着,你无法在匿名函数内部调用自身了。)

参考